#ifndef LOGGER_HPP
#define LOGGER_HPP

#include "ILogReceiver.hpp"
#include <QList>
#include <QMutex>
#include <QString>
#include <QtGlobal>
#include <QDateTime>
#include <QMessageLogContext>

/**
 * @brief Logger 类用于管理日志接收者并分发日志消息
 */
class Logger {
public:
    /**
     * @brief 获取 Logger 的单例实例
     * @return Logger 实例
     */
    static Logger& instance() {
        static Logger _instance;
        return _instance;
    }

    /**
     * @brief 添加一个日志接收者
     * @param receiver ILogReceiver 实例
     */
    void addLogReceiver(ILogReceiver* receiver) {
        QMutexLocker locker(&mutex);
        receivers.append(receiver);
    }

    /**
     * @brief 移除一个日志接收者
     * @param receiver ILogReceiver 实例
     */
    void removeLogReceiver(ILogReceiver* receiver) {
        QMutexLocker locker(&mutex);
        receivers.removeAll(receiver);
    }

    /**
     * @brief 分发日志消息给所有接收者
     * @param type 日志类型
     * @param file 文件名
     * @param line 行号
     * @param function 函数名
     * @param msg 日志消息
     */
    void log(QtMsgType type, const QString &file, int line, const QString &function, const QString &msg) {
        QList<ILogReceiver*> receiversCopy;
        {
            QMutexLocker locker(&mutex);
            receiversCopy = receivers; // 复制接收者列表
        }
        for(auto receiver : receiversCopy) {
            receiver->writeLog(type, file, line, function, msg);
        }
    }

    /**
     * @brief 安装消息处理器
     */
    static void installMessageHandler() {
        getPreviousHandler() = qInstallMessageHandler(messageHandler);
    }

    /**
     * @brief 自定义的消息处理器，用于处理 Qt 日志消息
     * @param type 日志类型
     * @param context 日志上下文
     * @param msg 日志消息
     */
    static void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
        // 防止递归调用
        if(getInHandler()) {
            return;
        }

        setInHandler(true);

        QString file = context.file ? QString(context.file) : "unknown file";
        int line = context.line;
        QString function = context.function ? QString(context.function) : "unknown function";

        // 分发日志到所有接收者
        Logger::instance().log(type, file, line, function, msg);

        setInHandler(false);

        // **移除以下代码，以防止默认处理器再次输出日志**
        /*
        if(getPreviousHandler()) {
            getPreviousHandler()(type, context, msg);
        }
        */
    }

private:
    Logger() {}
    ~Logger() {}

    Logger(const Logger&) = delete;
    Logger& operator=(const Logger&) = delete;

    /**
     * @brief 获取保存之前消息处理器的引用
     * @return QtMessageHandler 引用
     */
    static QtMessageHandler& getPreviousHandler() {
        static QtMessageHandler previousHandler = nullptr;
        return previousHandler;
    }

    /**
     * @brief 获取是否正在处理消息
     * @return bool 是否正在处理
     */
    static bool& getInHandler() {
        static bool inHandler = false;
        return inHandler;
    }

    /**
     * @brief 设置是否正在处理消息
     * @param value 新值
     */
    static void setInHandler(bool value) {
        getInHandler() = value;
    }

    QList<ILogReceiver*> receivers; /**< 日志接收者列表 */
    QMutex mutex; /**< 互斥锁，保护接收者列表 */
};

#endif // LOGGER_HPP
